home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / VFOS_NT.C < prev    next >
C/C++ Source or Header  |  1996-03-23  |  12KB  |  412 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*         This module was originally written by Vince Perriello            */
  13. /*                                                                          */
  14. /*                  BinkleyTerm Windows NT VFOSSIL module                   */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. /* #include "includes.h" */
  47.  
  48. #ifndef _WIN32
  49. #pragma message("This Module For Windows NT")
  50. #else
  51.  
  52. #include <stdlib.h>
  53. #include <stdio.h>
  54. #include <string.h>
  55. #include <fcntl.h>
  56. #include <io.h>
  57. #include <time.h>
  58. #include <memory.h>
  59. #include <windows.h>
  60.  
  61. #include "vfossil.h"
  62.  
  63. extern VIOMODEINFO vfos_mode;
  64. extern int vfossil_installed;
  65.  
  66. static unsigned long saved_key = 0xFFFFFFFF;
  67. static HANDLE hConsoleInput = INVALID_HANDLE_VALUE;
  68. static HANDLE hConsoleOutput = INVALID_HANDLE_VALUE;
  69.  
  70. char
  71. *SzVersionString(void)
  72. {
  73.     char *p;
  74.     OSVERSIONINFO osvi;
  75.     BOOL fResult;
  76.  
  77.     ZeroMemory (&osvi, sizeof (OSVERSIONINFO));
  78.     osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
  79.     fResult = GetVersionEx (&osvi);
  80.     if (!fResult || osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  81.         p = "Win NT";
  82.     else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  83.         p = "Win 95";
  84.     else if (osvi.dwPlatformId == VER_PLATFORM_WIN32s)
  85.         p = "Win32s";
  86.     else p = "Win32?";
  87.  
  88.     return p;
  89. }
  90.  
  91.  
  92. void 
  93. Make_Sound (char *WaveFile)
  94. {
  95.     if (WaveFile == NULL)
  96.         return;
  97.     PlaySound (WaveFile, 0L, (SND_FILENAME | SND_ASYNC | SND_NOWAIT));
  98. }
  99.  
  100. short 
  101. KBHit (void)
  102. {
  103.     int iKey = 0;
  104.     INPUT_RECORD irBuffer;
  105.     DWORD pcRead;
  106.  
  107.     if (saved_key != 0xFFFFFFFF)
  108.     {
  109.         return (short) (saved_key);
  110.     }
  111.  
  112.     /* zero out input record structure */
  113.  
  114.     memset (&irBuffer, 0, sizeof (INPUT_RECORD));
  115.  
  116.     if (hConsoleInput == INVALID_HANDLE_VALUE)
  117.     {
  118.         hConsoleInput = GetStdHandle (STD_INPUT_HANDLE);
  119.         if (hConsoleInput == INVALID_HANDLE_VALUE)
  120.         {
  121.             fprintf (stderr, "\nFailed to open console handle!\n");
  122.             exit (3);
  123.         }
  124.     }
  125.  
  126.     if (WaitForSingleObject (hConsoleInput, 0L) == 0)
  127. #if 0
  128.     {
  129.         ReadConsoleInput (hConsoleInput, &irBuffer, 1, &pcRead);
  130.         if (irBuffer.EventType == KEY_EVENT && irBuffer.Event.KeyEvent.bKeyDown != 0)
  131.             iKey = irBuffer.Event.KeyEvent.wVirtualKeyCode;
  132.     }
  133. #endif
  134.     {
  135.         ReadConsoleInput (hConsoleInput, &irBuffer, 1, &pcRead);
  136.         if (irBuffer.EventType == KEY_EVENT &&
  137.             irBuffer.Event.KeyEvent.bKeyDown != 0 &&
  138.             irBuffer.Event.KeyEvent.wRepeatCount <= 1)
  139.         {
  140.             unsigned short vk;
  141.             unsigned short vs;
  142.             unsigned char uc;
  143.             BOOL fShift;
  144.             BOOL fAlt;
  145.             BOOL fCtrl;
  146.  
  147.             vk = irBuffer.Event.KeyEvent.wVirtualKeyCode;
  148.             vs = irBuffer.Event.KeyEvent.wVirtualScanCode;
  149.             uc = irBuffer.Event.KeyEvent.uChar.AsciiChar;
  150.  
  151.             fShift = (irBuffer.Event.KeyEvent.dwControlKeyState & (SHIFT_PRESSED));
  152.             fAlt = (irBuffer.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED + LEFT_ALT_PRESSED));
  153.             fCtrl = (irBuffer.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED + LEFT_CTRL_PRESSED));
  154. #if 0
  155.             printf ("VK=%x,VS=%x,uChar=%x\n", vk, vs, uc);
  156.             printf ("SHIFT=%s,ALT=%s,CTRL=%s\n",
  157.                 fShift ? "ON" : "OFF",
  158.                 fAlt ? "ON" : "OFF",
  159.                 fCtrl ? "ON" : "OFF");
  160. #endif
  161.             /* The following is ugly, incomplete and nonportable.
  162.             ** It mostly handles Fkeys; Alt+Fkeys; Shift+FKeys;
  163.             ** Printable charactes; Alt+printable characters;
  164.             ** Ctrl+printable characters.
  165.             */
  166.  
  167.             if (uc == 0)                            /* FKeys */
  168.             {
  169.                 if (vk == 0x21)                        /* PG UP */
  170.                 {
  171.                     if (fCtrl)                        /* Special case     */
  172.                         vs = 0x84;                    /* CTRL+PG UP       */
  173.                 }
  174.                 else if (vk == 0x22)                /* PG DN */
  175.                 {
  176.                     if (fCtrl)                        /* Special case     */
  177.                         vs = 0x76;                    /* CTRL+PG DN       */
  178.                 }
  179.                 else if (vk == 0x23)                /* END */
  180.                 {
  181.                     if (fCtrl)                        /* Special case     */
  182.                         vs = 0x75;                    /* CTRL+END         */
  183.                 }
  184.                 else if (vk == 0x24)                /* HOME */
  185.                 {
  186.                     if (fCtrl)                        /* Special case     */
  187.                         vs = 0x77;                    /* CTRL+HOME        */
  188.                 }
  189.                 else if (vk == 0x26)                /* UP AR */
  190.                 {
  191.                     if (fCtrl)                        /* Special case     */
  192.                         vs = 0x8D;                    /* CTRL+UP AR       */
  193.                 }
  194.                 else if (vk == 0x28)                /* DN AR */
  195.                 {
  196.                     if (fCtrl)                        /* Special case     */
  197.                         vs = 0x91;                    /* CTRL+DN AR       */
  198.                 }
  199.                 else if (vk >= 0x70 && vk <= 0x79)    /* FKeys */
  200.                 {
  201.                     if (fAlt)
  202.                         vs += 0x2d;                    /* Hack Alt+FKey    */
  203.                     else if (fShift)
  204.                         vs += 0x19;                    /* Hack Shift+Fkey  */
  205.                 }
  206.                 if (vk > 0x20 && vk < 0x92)            /* If it's OK   */
  207.                     iKey = (vs << 8);                /* use scan code    */
  208.             }
  209.             else
  210.             {
  211.                 if (fAlt)                            /* Hack Alt Key     */
  212.                     iKey = (vs << 8);
  213.                 else if (fCtrl)                        /* Hack Ctrl Key    */
  214.                     iKey = (vk & 0xBF);
  215.                 else
  216.                     iKey = uc;
  217.             }
  218. #if 0
  219.             printf ("iKey=%04x\n", iKey);
  220. #endif
  221.         }
  222.     }
  223.  
  224.     if (iKey != 0)
  225.         saved_key = iKey;
  226.     return (short) (iKey);
  227. }
  228.  
  229. short 
  230. GetKBKey (void)
  231. {
  232.     int iKey;
  233.  
  234.     while (saved_key == 0xFFFFFFFF)
  235.     {
  236.         (void) KBHit ();
  237.     }
  238.     iKey = saved_key;
  239.     saved_key = 0xFFFFFFFF;
  240.     return (short) (iKey);
  241. }
  242.  
  243. void 
  244. vfossil_init (void)
  245. {
  246.     PVIOMODEINFO q = &vfos_mode;
  247.  
  248.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  249.  
  250.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  251.     {
  252.         hConsoleOutput = GetStdHandle (STD_OUTPUT_HANDLE);
  253.         if (hConsoleOutput == INVALID_HANDLE_VALUE)
  254.         {
  255.             fprintf (stderr, "\nFailed to open console handle!\n");
  256.             exit (3);
  257.         }
  258.     }
  259.  
  260.     if (!GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
  261.         return;
  262.  
  263.     memset ((void *) q, 0, sizeof (VIOMODEINFO));
  264.     q->cb = sizeof (VIOMODEINFO);
  265.     q->col = csbi.dwSize.X;
  266.     q->row = csbi.dwSize.Y;
  267.     vfossil_installed = 1;
  268. }
  269.  
  270. void 
  271. vfossil_cursor (int st)
  272. {
  273.     CONSOLE_CURSOR_INFO cci;
  274.  
  275.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  276.         vfossil_init ();
  277.  
  278.     if (!GetConsoleCursorInfo (hConsoleOutput, &cci))
  279.         return;
  280.  
  281.     if (cci.bVisible != (st != 0))
  282.     {
  283.         cci.bVisible = (st != 0);
  284.         SetConsoleCursorInfo (hConsoleOutput, &cci);
  285.     }
  286. }
  287.  
  288. void 
  289. vfossil_close (void)
  290. {
  291. #if 0
  292.     if (hConsoleOutput != INVALID_HANDLE_VALUE)
  293.     {
  294.         vfossil_cursor (1);
  295.         (void) CloseHandle (hConsoleOutput);
  296.         hConsoleOutput = INVALID_HANDLE_VALUE;
  297.     }
  298.     vfossil_installed = 0;
  299. #else
  300.     vfossil_cursor (1);
  301. #endif
  302. }
  303.  
  304. void 
  305. fossil_gotoxy (int col, int row)
  306. {
  307.     COORD dwCursorPosition;
  308.  
  309.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  310.         vfossil_init ();
  311.  
  312.     dwCursorPosition.X = col;
  313.     dwCursorPosition.Y = row;
  314.  
  315.     (void) SetConsoleCursorPosition (hConsoleOutput, dwCursorPosition);
  316. }
  317.  
  318. int 
  319. fossil_wherex (void)
  320. {
  321.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  322.  
  323.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  324.         vfossil_init ();
  325.  
  326.     if (!GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
  327.         return 1;
  328.  
  329.     return csbi.dwCursorPosition.X;
  330. }
  331.  
  332. int 
  333. fossil_wherey (void)
  334. {
  335.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  336.  
  337.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  338.         vfossil_init ();
  339.  
  340.     if (!GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
  341.         return 1;
  342.  
  343.     return csbi.dwCursorPosition.Y;
  344. }
  345.  
  346. USHORT 
  347. VioWrtTTY (PCH pchString, USHORT cbString, USHORT hvio)
  348. {
  349.     DWORD dwCount;
  350.     DWORD dwWritten;
  351.     BOOL fResult;
  352.  
  353.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  354.         vfossil_init ();
  355.  
  356.     dwCount = cbString;
  357.     fResult = WriteConsole (hConsoleOutput, pchString, dwCount, &dwWritten, NULL);
  358.     return (fResult != TRUE);
  359. }
  360.  
  361. /* Raise max to whatever you need. Change 500 to n and 1000 to 2n. */
  362.  
  363. USHORT 
  364. VioWrtCellStr (PCH pchCellString, USHORT cbCellString, USHORT usRow, USHORT usColumn, USHORT hvio)
  365. {
  366.     DWORD dwWritten;
  367.     BOOL fResult = TRUE;
  368.     static char vchars[500];
  369.     static WORD vattrs[500];
  370.     COORD dwCursorPosition;
  371.  
  372.     int i, count;
  373.     char *p;
  374.     unsigned char *s = (unsigned char *) pchCellString;
  375.     WORD *q;
  376.  
  377.     if (cbCellString > 1000)
  378.         return 1;
  379.  
  380.     if (hConsoleOutput == INVALID_HANDLE_VALUE)
  381.         vfossil_init ();
  382.  
  383.     dwCursorPosition.X = usColumn;
  384.     dwCursorPosition.Y = usRow;
  385.  
  386.     count = cbCellString >> 1;
  387.     for (p = vchars, q = vattrs, i = 0; i < count; i++)
  388.     {
  389.         *p++ = (char) (*s++);
  390.         *q++ = (WORD) (*s++);
  391.     }
  392.  
  393.     fResult = WriteConsoleOutputCharacter (
  394.         hConsoleOutput,
  395.         vchars,
  396.         count,
  397.         dwCursorPosition,
  398.         &dwWritten);
  399.  
  400.     if (fResult)
  401.     {
  402.         fResult = WriteConsoleOutputAttribute (
  403.             hConsoleOutput,
  404.             vattrs,
  405.             count,
  406.             dwCursorPosition,
  407.             &dwWritten);
  408.     }
  409.     return (fResult != TRUE);
  410. }
  411. #endif
  412.